#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>

#include "rs485_dir.h"

struct rs485_dir_t rs485_dir;

static void rs_dir_open(void)
{
  //rs485_dir.rs485_dir_fd = open("/dev/rs485_dir_drv",O_RDWR);
  rs485_dir.fd = open(rs485_dir.dev, O_RDWR);
  if(rs485_dir.fd == -1)
  {
    printf("rs485 dir dev un exist\n");
  }
  printf("rs485_dir.fd: %d\n", rs485_dir.fd);
}

static void rs_dir_close(void)
{
  if(rs485_dir.fd > 0)
  {
    close(rs485_dir.fd);
    return ;
  }
  printf("rs485 dir fd uncreated\n");
}

static void rs_dir_set_mode(enum rs485_dir_mode_t mode)
{
  rs485_dir.msg.mode = mode;
  rs485_dir.msg.num.de = rs485_dir.gpio_de;
  rs485_dir.msg.num.re = rs485_dir.gpio_re;
  ioctl(rs485_dir.fd, WRITE_POWER_STATUS, (unsigned long *)&rs485_dir.msg);
}

static void rs_dir_set_gpio(int de, int re)
{
  rs485_dir.gpio_re = re;
  rs485_dir.gpio_de = de;
}

static void rs_dir_set_dev(char *dev, int len)
{
  if(len >= 30)
  {
    printf("rs485 dir dev is large");
    return ;
  }
  memcpy(rs485_dir.dev, dev, len);
  rs485_dir.dev[len] = '\0';
  //printf("%s\n",rs485_dir.dev);
}

void rs485_dir_init(void)
{
  rs485_dir.open = rs_dir_open;
  rs485_dir.close = rs_dir_close;
  rs485_dir.set_mode = rs_dir_set_mode;
  rs485_dir.set_gpio = rs_dir_set_gpio;
  rs485_dir.set_dev = rs_dir_set_dev;
}
